package rabbitmq.test.dlx;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * 声明一套死信结构
 */
public class DlxDeclare {
    //连接channel
    private Channel channel;
    @Before
    public void init() throws IOException, TimeoutException {
        //通过java客户端建立和rabbitmq的连接
        ConnectionFactory factory=new ConnectionFactory();
        //给工厂提供链接属性 ip:port
        factory.setHost("192.168.8.100");
        factory.setPort(5672);
        //权限账号 admin/123456
        factory.setUsername("admin");
        factory.setPassword("123456");
        //虚拟主机,每隔连接工厂,由一个程序管理,程序所属的环境 连接的虚拟主机 virtual_host不同
        //实现不同环境的数据隔离 默认就是/
        factory.setVirtualHost("/");
        Connection connection = factory.newConnection();
        //可以从长连接获取短链接
        channel = connection.createChannel();
    }
    //为案例中声明各种名称 字符串 设置常量
    //业务交换机名字
    public static final String BIZ_EX="biz_ex";
    //业务队列名字
    public static final String BIZ_QUEUE="biz_queue";
    //死信交换机名字
    public static final String DLX_EX="dlx_ex";
    //死信队列名字
    public static final String DLX_QUEUE="dlx_queue";
    //死信路由key
    public static final String DLX_ROUTING_KEY="dlx_routing_key";

    @Test
    public void dlxDeclare() throws IOException {
        //声明两个交换机
        channel.exchangeDeclare(BIZ_EX,"fanout");
        channel.exchangeDeclare(DLX_EX,"direct");
        //声明死信队列
        channel.queueDeclare(DLX_QUEUE,false,false,false,null);
        //声明业务队列
        Map<String,Object> args=new HashMap<>();
        //消息超时时间 产生死信条件之一
        args.put("x-message-ttl",10000);
        //业务队列绑定死信交换机
        args.put("x-dead-letter-exchange",DLX_EX);
        //业务队列绑定死信路由key
        args.put("x-dead-letter-routing-key",DLX_ROUTING_KEY);
        channel.queueDeclare(BIZ_QUEUE,false,false,false,args);
        //声明绑定关系 一定是队列绑定交换机
        channel.queueBind(BIZ_QUEUE,BIZ_EX,"");
        //声明绑定关系 死信队列 使用死信路由key 绑定死信交换机
        channel.queueBind(DLX_QUEUE,DLX_EX,DLX_ROUTING_KEY);
    }
}
